package cn.gwm.flink.streaming.config;

import cn.gwm.utils.GlobalConfigUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author: liangguang
 * @Date: 2023/02/08
 * @Description:
 */
@Getter
public enum ChargeConfigEnum implements GlobalConfig {

    TEMPRISE("tempRise", "1", "充电平台期的最大充电能力确定：温度递增？℃"),
    CURRENTWAVE("currentWave", "1", "电流波动 ≤± ？A"),
    DURATIONMIN("tempRise", "1", "充电平台期的最大充电能力确定：持续时长≥ ？ MIN"),
    SLOWPOWER("slowPower", "3.5", "慢充连接状态下，充电功率低于 ？KW 计为家用慢充 单位 KW"),
    FASTPOWER("fastPower", "120", "快充连接状态下，充电功率高于 ？KW 计为超级快充 单位 KW"),
    PLUGINTERVAL("plugInterval", "3", "以每次插枪过程为一次充电记录，其中连续、同一连接类型连续插拔枪时间超过 ？分钟，视为两次全过程充电 "),
    CHARGEINTERRUPT("chargeInterrupt", "30", "充电次数定义：在一次全过程充电中，充电中断 ？分钟以上，视为两次逻辑充电 "),
    DATAPERSISTENCE("dataPersistence", "30", "为提高数据容错能力，当数据持续 ？秒  以上，方认为有效 "),
    ;


    /**
     * 显示
     */
    private String name;
    /**
     * 状态
     */
    private String value;
    /**
     * 描述
     */
    private String desc;

    ChargeConfigEnum(String name, String value, String desc) {
        this.name = name;
        this.value = value;
        this.desc = desc;
    }

    @Override
    public void setValue(String value) {
        this.value = value;
    }

    /**
     * 获取value参数  用 getValue方法，不能直接调用 .value 否则获取的是默认值
     *
     * @return
     */
    @Override
    public String getValue() {
        // 访问更新
        ChargeConfigUtil.controlUpdateConfig();
        return value;
    }


    @Slf4j
    static class ChargeConfigUtil {

        public static final String TOPIC = "charge";
        private static final Integer MINUTE = 16;

        public static AtomicBoolean REQUEST_FLAG = new AtomicBoolean(true);

        public static AtomicInteger FIRST = new AtomicInteger(0);

        public static void controlUpdateConfig() {
            if (FIRST.get() == 0) {
                GlobalConfigUtil.requestConfig(TOPIC, ChargeConfigEnum.values());
                FIRST.incrementAndGet();
            } else {
                // 每小时更新一次，16分
                if (DateUtil.date().getField(DateField.MINUTE) == MINUTE) {
                    if (REQUEST_FLAG.get()) {
                        GlobalConfigUtil.requestConfig(TOPIC, ChargeConfigEnum.values());
                        REQUEST_FLAG.set(false);
                    }
                } else {
                    REQUEST_FLAG.set(true);
                }
            }

        }


    }
}
